perm filename PGFAI.FAI[VIS,HPM] blob sn#426072 filedate 1979-03-17 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	PGFAI
C00004 00003	T←0 ↔ YLO←1 ↔ XLO←2 ↔ YHI←3 ↔ XHI←4 ↔ PIC←7
C00007 00004	BITUP PMIDI PBSK XLMSK XRMSK
C00008 00005	HORUP
C00010 00006	VERUP:	0				ROUTINE FOR MAKING A VERTICAL
C00011 00007	DELT←6 ↔ DIND←12 ↔ XLO←14 ↔ YLO←15
C00015 00008	XL:	0.0
C00017 00009	XLITEN XDRKEN XINVEN
C00018 00010	PDOT:	SAVAC(10)
C00019 00011	PLINE:	SAVAC(16)		DRAW A LINE FORM (X1,Y1) TO (X2,Y2)
C00020 00012		EXTERN	$$$PX,$$$PY,$$$RNK,$$$DXS,$$$NS,$$LOUT,$$$LXS
C00022 00013	SAVN:	0
C00027 00014		END
C00028 ENDMK
C⊗;
	TITLE	PGFAI
		       ;MAKES LINES AND THINGS IN ONE BIT PICTURES
	ENTRY	PDDINI,PSCREE,PSCREM,PLINE,PDOT,PPOLYG
	ENTRY	PDRKEN,PLITEN,PINVEN
	ENTRY	PBSK,PMIDI
        ENTRY	PPHYSS

PXLO: 0
PYLO: 0
PXHI: 0
PYHI: 0
PPIC: 0

PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←13
LINTAB←←14

PIC←7
P←17 

NWDS:	   0		;number of words in scanline, including border
XLOO:0		;X offset
XLOL:0		;left limit
XHIL:0		;right limit

YLOO:0		;Y offset
YLOL:0		;top limit
YHIL:0		;bottom limit

NLINA:0		;virtual buffer height for SCREEN calculation
NBITA:0		;virtual width

RETAD:	0
ACS:	BLOCK	20

	DEFINE	SAVAC(N)
<	IFGE	N-12,{MOVEM 12,ACS+12}
	IFGE	N-16,{MOVEM 16,ACS+16}
	IFGE	N-17,{MOVEM 17,ACS+17}	>

	DEFINE	RESAC(N)
<	IFGE	N-12,{MOVE 12,ACS+12}
	IFGE	N-16,{MOVE 16,ACS+16}
	IFGE	N-17,{MOVE 17,ACS+17}	>

	define fix(x)<kifix x,x>
T←0 ↔ YLO←1 ↔ XLO←2 ↔ YHI←3 ↔ XHI←4 ↔ PIC←7

PPHYSS: POP	P,RETAD		;return position and limits of drawing buffer
	POP	P,XHI
        MOVE	T,PXHI
        MOVEM	T,(XHI)
	POP	P,YHI
        MOVE	T,PYHI
        MOVEM	T,(YHI)
	POP	P,XLO
        MOVE	T,PXLO
        MOVEM	T,(XLO)
	POP	P,YLO
        MOVE	T,PYLO
        MOVEM	T,(YLO)
	POP	P,PIC
        MOVE	T,PPIC
        MOVEM	T,(PIC)
	JRST	@RETAD

PDDINI: POP	P,RETAD		;establish a buffer for drawing
	POP	P,XHI
	POP	P,YHI
	POP	P,XLO
	POP	P,YLO
	POP	P,PIC
        MOVEM	PIC,PPIC
 	CAMLE	XLO,XHI
	EXCH	XLO,XHI
	CAMLE	YLO,YHI
	EXCH	YLO,YHI
        MOVEM	XLO,PXLO
        MOVEM	XHI,PXHI
        MOVEM	YLO,PYLO
        MOVEM	YHI,PYHI

	MOVE	T,YHI		;height, for SCREEN calculation
	SUB	T,YLO
	ADDI	T,1
	MOVEM	T,NLINA

	MOVE	T,XHI		;width, for SCREEN calculation
	SUB	T,XLO
	ADDI	T,1
	MOVEM	T,NBITA

	MOVEM	XLO,XLOO	;X offset for deposits
	MOVEM	YLO,YLOO	;Y offset

	CAIGE	XLO,0
	MOVEI	XLO,0
	MOVEM	XLO,XLOL	;physical left limit
	
	CAIGE	YLO,0
	MOVEI	YLO,0
	MOVEM	YLO,YLOL	;physical top limit

	MOVE	T,LNBY(PIC)
	SUBI	T,1
	CAMLE	XHI,T
	MOVE	XHI,T
	MOVEM	XHI,XHIL	;physical right limit

	MOVE	T,PCLN(PIC)
	SUBI	T,1
	CAMLE	YHI,T
	MOVE	YHI,T
	MOVEM	YHI,YHIL	;pyhsical bottom limit

	MOVE	YLO,LNWD(PIC)
	MOVEM	YLO,NWDS		;save scanlinesize
	IMUL	YLO,YLOO		
        MOVE	T,LINTAB(PIC)
	ADD	T,YLO		;Y offset can be done implicitly
	HRRM	T,PMIDI

	MOVN	YLO,YLOO
	ADDM	YLO,YLOL
	ADDM	YLO,YHIL

	JRST	@RETAD
;BITUP PMIDI PBSK XLMSK XRMSK
X1←1 ↔  XA←2 ↔  X2←3 ↔  XB←4 ↔ Y1←5 ↔  Y2←11


XRMSK:	FOR I←0,43,1 {	(-1)⊗(-I) 
					   }

XLMSK:	FOR I←0,43,1 {	¬(377777777777⊗(-I))
						    }

PBSK:	FOR I←0,43,1 {	400000000000 ⊗ (-I)
						}


BITUP:	0				;ROUTINE FOR PLACING A BIT AT (X1,Y1)
	CAML	Y1,YLOL
	CAMLE	Y1,YHIL
	JRST	@BITUP
	ADD	X1,XLOO
	CAML	X1,XLOL
	CAMLE	X1,XHIL
	JRST	@BITUP
	IDIVI	X1,44
	MOVE	10,PBSK(XA)
        IMUL	Y1,NWDS
	ADD	X1,Y1
PMIDI:	ORM	10,(X1)
	JRST	@BITUP
;HORUP
HORUP:	0				;ROUTINE FOR PUTTING UP A HORIZONTAL
	CAML	Y1,YLOL			;LINE AT Y1, BETWEEN X1 AND X2
	CAMLE	Y1,YHIL
	JRST	@HORUP
	ADD	X1,XLOO
	ADD	X2,XLOO
	CAMLE	X1,X2
	EXCH	X1,X2
	CAML	X2,XLOL
	CAMLE	X1,XHIL
	JRST	@HORUP
	CAMGE	X1,XLOL
	MOVE	X1,XLOL
	CAMLE	X2,XHIL
	MOVE	X2,XHIL
	IDIVI	X1,44
	IDIVI	X2,44
	MOVE	10,XRMSK(XA)
	SUB	X2,X1
	MOVE	0,Y1
        IMUL	0,NWDS
	ADD	X1,0

	JUMPG	X2,NOTE
	AND	10,XLMSK(XB)
	XCT	PMIDI
	JRST	@HORUP
NOTE:	XCT	PMIDI
	SETO	10,
LMDL:	AOS	X1
	SOJLE	X2,FINE
	XCT	PMIDI
	AOJA	X1,LMDL+1
FINE:	MOVE	10,XLMSK(XB)
	XCT	PMIDI
	JRST	@HORUP
VERUP:	0				;ROUTINE FOR MAKING A VERTICAL
	ADD	X1,XLOO
	CAML	X1,XLOL			;LINE AT X1 BETWEEN Y1 AND Y2
	CAMLE	X1,XHIL
	JRST	@VERUP
	CAML	Y1,Y2
	EXCH	Y1,Y2
	CAML	Y2,YLOL
	CAMLE	Y1,YHIL
	JRST	@VERUP
	CAMGE	Y1,YLOL
	MOVE	Y1,YLOL
	CAMLE	Y2,YHIL
	MOVE	Y2,YHIL
	SUBI	Y2,1
	IDIVI	X1,44
	MOVE	10,PBSK(XA)
	MOVE	0,Y1
	IMUL	0,NWDS
	ADD	X1,0
VLP:	XCT	PMIDI
	CAML	Y1,Y2
	JRST	@VERUP
	ADD	X1,NWDS
	AOJA	Y1,VLP
DELT←6 ↔ DIND←12 ↔ XLO←14 ↔ YLO←15
OBLUP:	0				;ROUTINE FOR DRAWING AN OBLIQUE
	SUB	X2,X1			;LINE FROM (X1,Y1) TO (X2,Y2)
	SUB	Y2,Y1
	MOVM	XLO,X2
	MOVM	YLO,Y2
	MOVEI	DELT,400000
	CAMLE	XLO,YLO
	JRST	DXGR
DYGR:	JUMPGE	X2,DYPDXL
	MOVN	X2,X2
	MOVN	Y2,Y2
	SUB	X1,X2
	SUB	Y1,Y2
DYPDXL:	HRL	DELT,Y2
	AOS	DIND,X2
	IDIV	DELT,X2
	HRLZ	YLO,Y1
	MOVE	XLO,X1
SGLP:	MOVE	Y2,DELT
	ADDB	YLO,Y2
	HLRE	Y2,Y2
	JSR	VERUP
	SOJLE	DIND,@OBLUP
	AOS	X1,XLO
	HLRE	Y1,YLO
	JRST	SGLP
DXGR:	JUMPGE	Y2,DYPDXG
	MOVN	X2,X2
	MOVN	Y2,Y2
	SUB	X1,X2
	SUB	Y1,Y2
DYPDXG:	HRL	DELT,X2
	AOS	DIND,Y2
	IDIV	DELT,Y2
	HRLZ	XLO,X1
	MOVE	YLO,Y1
SIGLP1:	MOVE	X2,DELT
	ADDB	X2,XLO
	HLRE	X2,X2
	JSR	HORUP
	SOJLE	DIND,@OBLUP
	AOS	Y1,YLO
	HLRE	X1,XLO
	JRST	SIGLP1
XL:	0.0
XH:	1.0
XSC:	1476.0
YL:	0.0
YH:	1.0
YSC:	2048.0

PSCREE:	SAVAC(3)		;SET UP SCREEN DIMENSIONS
	POP	P,RETAD		;SCREEN(XL,YL,XH,YH)
	POP	P,YL		;DEFAULT XL=0.0 YH=1.0
	POP	P,XH		;	 YL=0.0 YH=1.0
	POP	P,YH
	POP	P,XL
	MOVE	1,XH
	FSBR	1,XL
	FLTR	3,NBITA
	FMPR	3,[0.9999]
	FDVR	3,1
	MOVEM	3,XSC
	MOVE	1,YH
	FSBR	1,YL
	FLTR	3,NLINA
	FMPR	3,[0.9999]
	FDVR	3,1
	MOVEM	3,YSC
	RESAC(3)
	JRST	@RETAD

PSCREM:	POP	P,RETAD
	POP	P,1
	MOVE	2,YL
	MOVEM	2,(1)
	POP	P,1
	MOVE	2,XH
	MOVEM	2,(1)
	POP	P,1
	MOVE	2,YH
	MOVEM	2,(1)
	POP	P,1
	MOVE	2,XL
	MOVEM	2,(1)
        JRST	@RETAD
;XLITEN XDRKEN XINVEN
PLITEN:	MOVE	1,[ ORM 10,(X1)]	;OUTPUTS TO APPEAR BRIGHT
	HLLM	1,PMIDI			;(ACTUALLY DARK TONER ON XGP)
	POPJ	P,

PDRKEN:	MOVE	1,[ ANDCAM 10,(X1)]	 ;OUTPUTS DARK
	HLLM	1,PMIDI			 ;(WHITE, ACTUALLY, PAPER SHOWS THRU)
	POPJ	P,

PINVEN:	MOVE	1,[ XORM 10,(X1)]	;OUTPUTS TO NEGATE PREVIUS DISPLAY
	HLLM	1,PMIDI
	POPJ	P,
PDOT:	SAVAC(10)
	POP	P,RETAD
	POP	P,Y1
	FSBR	Y1,YL
	FMPR	Y1,YSC
	FIX	Y1
	POP	P,X1
	FSBR	X1,XL
	FMPR	X1,XSC
	FIX	X1
	JSR	BITUP
	RESAC(10)
	JRST	@RETAD
PLINE:	SAVAC(16)		;DRAW A LINE FORM (X1,Y1) TO (X2,Y2)
	POP	P,RETAD
	POP	P,Y2
	FSBR	Y2,YL
	FMPR	Y2,YSC
	FIX	Y2
	POP	P,X2		;LINE(X1,Y1,X2,Y2)
	FSBR	X2,XL
	FMPR	X2,XSC
	FIX	X2
	POP	P,Y1
	FSBR	Y1,YL
	FMPR	Y1,YSC
	FIX	Y1
	POP	P,X1
	FSBR	X1,XL
	FMPR	X1,XSC
	FIX	X1
	JSR	OBLUP
	RESAC(16)
	JRST	@RETAD

	EXTERN	$$$PX,$$$PY,$$$RNK,$$$DXS,$$$NS,$$LOUT,$$$LXS

X1←1 ↔  XA←2  ↔ JJ←2
X2←3 ↔  XB←4  ↔ T←4
Y1←5
Y2←←6
I←←7
II←←12
N←13
J←←14
TT←←15
TTT←←16
P←17

PPOLYG: movem	12,ac12#	;FILL IN AN N SIDED POLYGON
	movem	16,ac16#
	POP	P,RETAD		; POLYGO(N,X,Y)
	POP	P,Y2		;  X AND Y ARE EACH CONTIGUOUS ARRAYS
	POP	P,X2
	POP	P,N
	HRRZ	T,N
	MOVE	N,T
LFL:	MOVE	TT,(X2)
	FSBR	TT,XL
	FMPR	TT,XSC
	FIX	TT
	MOVEM	TT,$$$PX(T)
	MOVE	TT,(Y2)
	FSBR	TT,YL
	FMPR	TT,YSC
	FIX	TT
	MOVEM	TT,$$$PY(T)
	ADDI	X2,1
	ADDI	Y2,1
	SOJG	T,LFL
	JSR	POLYUP
	move	12,ac12
	move	16,ac16
	JRST	@RETAD
SAVN:	0

POLYUP:	0			;ROUTINE TO FILL IN A POLYGON
	MOVEM	N,SAVN
	MOVEI	I,1
	MOVEM	I,$$$RNK+1		;PHASE 1, GENERATE AN
ILOP:	AOS	II,I		;INVERSE RANKING
	MOVE	T,$$$PY(I)		;KEYED ON Y VALUES
	MOVEI	J,1
JLOP:	MOVE	JJ,$$$RNK(J)
	CAML	T,$$$PY(JJ)
	JRST	NOXCH
	EXCH	II,$$$RNK(J)
	MOVE	T,$$$PY(II)
NOXCH:	CAIGE	J,-1(I)
	AOJA	J,JLOP
	MOVEM	II,$$$RNK(I)
	CAMGE	I,N
	JRST	ILOP
	MOVE	T,$$$PX+1
	MOVEM	T,$$$PX+1(N)
	MOVE	T,$$$PY+1
	MOVEM	T,$$$PY+1(N)
	MOVE	T,$$$PX(N)
	MOVEM	T,$$$PX
	MOVE	T,$$$PY(N)
	MOVEM	T,$$$PY
	
	MOVEI	I,1
	MOVEI	J,0
	MOVE	II,$$$RNK(I)
	MOVE	Y1,$$$PY(II)
NEWPNT:	HRLZ	X1,$$$PX(II)
	MOVE	T,$$$PY-1(II)
	SUB	T,Y1
	JUMPLE	T,TRYLOW+1		;FORGET IT IF THIS EDGE POINTS
	SKIPG	JJ,J			;UPWARDS
	JRST	HINS
HILP:	CAMG	X1,$$$LXS(JJ)
	JRST	HINS
	MOVE	TT,$$$LXS(JJ)
	MOVEM	TT,$$$LXS+1(JJ)
	MOVE	TT,$$$DXS(JJ)
	MOVEM	TT,$$$DXS+1(JJ)
	MOVE	TT,$$$NS(JJ)
	MOVEM	TT,$$$NS+1(JJ)
	SOJG	JJ,HILP
HINS:	MOVEM	T,$$$NS+1(JJ)		;INSERT LINE SEGS
	MOVEM	X1,$$$LXS+1(JJ)		;COMING INTO THE SCANLINE
	HLRE	X1,X1
	SUB	X1,$$$PX-1(II)
	HRLZ	X2,X1
	HRRI	X1,400000
	ADD	X2,X1
	IDIVI	X2,1(T)
	MOVNM	X2,$$$DXS+1(JJ)
	ADDI	J,1
TRYLOW:	HRLZ	X1,$$$PX(II)
	MOVE	T,$$$PY+1(II)
	SUB	T,Y1
	JUMPL	T,DRAWG			;IF THIS EDGE POINTS
	SKIPG	JJ,J			;UPWARDS, TIME TO DRAW
	JRST	LINS
LILP:	CAMG	X1,$$$LXS(JJ)
	JRST	LINS
	MOVE	TT,$$$LXS(JJ)
	MOVEM	TT,$$$LXS+1(JJ)
	MOVE	TT,$$$DXS(JJ)
	MOVEM	TT,$$$DXS+1(JJ)
	MOVE	TT,$$$NS(JJ)
	MOVEM	TT,$$$NS+1(JJ)
	SOJG	JJ,LILP
LINS:	MOVEM	T,$$$NS+1(JJ)
	MOVEM	X1,$$$LXS+1(JJ)
	HLRE	X1,X1
	SUB	X1,$$$PX+1(II)
	HRLZ	X2,X1
	HRRI	X1,400000
	ADD	X2,X1
	IDIVI	X2,1(T)
	MOVNM	X2,$$$DXS+1(JJ)
	ADDI	J,1
DRAWG:	CAML	I,SAVN
	JRST	DRAWM
	ADDI	I,1
SCNRE:	MOVE	II,$$$RNK(I)
SCNR:	CAMN	Y1,$$$PY(II)
	JRST	NEWPNT

DRAWM:	MOVE	JJ,J			;UPDATE EACH EDGE
	SETZB	T,II			;AND THEN
FLOP:	MOVE	X1,$$$LXS(JJ)		;MAKE UP DRAWING LIST
	MOVE	X2,$$$DXS(JJ)
	ADDB	X2,$$$LXS(JJ)
	JSR	FILIN
	SOSL	$$$NS(JJ)
	TRCE	T,1
	JUMPE	T,BLAR
	MOVE	X2,$$$LXS-1(JJ)
	JSR	FILIN
BLAR:	SOJG	JJ,FLOP
	
DRAWZ:	HRRE	X1,$$LOUT(II)		;DRAW THIS SET
	HLRE	X2,$$LOUT(II)
	JSR	HORUP
	SOJG	II,DRAWZ

NEXL:	MOVN	JJ,J			;REMOVE EXPIRED SEGMNTS
	HRLZ	JJ,JJ			;AND MAKE POINTS SORTED
	MOVEI	J,0			;AGAIN, IN PREPARATION
LPO:	SKIPL	$$$NS+1(JJ)		;FOR NEXT SCANLINE
	AOJA	J,NELP
SLOOP:	AOBJN	JJ,LPO
	JUMPLE	J,@POLYUP
	AOJA	Y1,SCNRE
NELP:	MOVE	T,$$$LXS+1(JJ)
	MOVE	TT,$$$DXS+1(JJ)
	MOVE	TTT,$$$NS+1(JJ)
	MOVEI	II,-1(J)
FLOOP:	CAMG	T,$$$LXS(II)
	JRST	PFND
	MOVE	X1,$$$LXS(II)
	MOVEM	X1,$$$LXS+1(II)
	MOVE	X1,$$$DXS(II)
	MOVEM	X1,$$$DXS+1(II)
	MOVE	X1,$$$NS(II)
	MOVEM	X1,$$$NS+1(II)
	SOJG	II,FLOOP
PFND:	MOVEM	T,$$$LXS+1(II)
	MOVEM	TT,$$$DXS+1(II)
	MOVEM	TTT,$$$NS+1(II)
	AOBJN	JJ,LPO
	AOJA	Y1,SCNRE

FILIN:	0				;ADD A LINE SEGMENT
	HLRM	X1,$$LOUT+1(II)
	HLLM	X2,$$LOUT+1(II)
	AOJA	II,@FILIN

	END